/*******************************************************************************
 * FilePath    : /Software/Examples_Ble_MS1642/ble_app_peripheral_uart_simple/main.c
 * Version     : 1.0
 * Brief       :
 * Author      : AndrewHu
 * Company     : Shanghai MacroGiga Electronics CO.,Ltd
 * Email       : Hubinbo@macrogiga.com
 * Date        : 2020-04-03 15:06:14
 * LastEditors : AndrewHu
 * LastEditTime: 2023-06-09 10:29:42
 * Description :
 ******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <Includes.h>
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function ----------------------------------------------------------*/
/* extern --------------------------------------------------------------------*/

/*******************************************************************************
 * Function    : Key_Run
 * Brief       : 按键信息反馈处理
 * Parameter   :
 * Returns     :
 * Date        : 2020-04-04 14:53:26
 * Description :
 ******************************************************************************/
void Key_Run(void)
{
    static u8 temp = 0;
    u8 event = Key_Scan();
    if ((event & KeyFlag_event) == 0x00)
        return;
    Key_ClearFlag();
    switch (event)
    {
    case (KeyFlag_event | KeyFlag_times | KeyFlag_down | 0x01): // 按键按下1次
        // LED_ChangeStatus();
        if (temp == 0)
        { // 进入低功耗，仅RTC工作
            temp = 1;
            SetRunningMode(dfRunningMode_Sleep);
            Uart_Send_String((u8 *)"\r\nSleepMode", 11);
        }
        else if (temp == 1)
        {
            temp = 2;
            SetRunningMode(dfRunningMode_Standby);
            Uart_Send_String((u8 *)"\r\nStandbyMode", 13);
        }
        else
        { // 全速运行
            temp = 0;
            SetRunningMode(dfRunningMode_Normal);
            Uart_Send_String((u8 *)"\r\nNormalMode", 12);
        }
        break;
    case (KeyFlag_event | KeyFlag_times | 0x01): // 按键按下1次后"立即"松开
        // Printf_Error(2);
        break;
    case (KeyFlag_event | KeyFlag_times | KeyFlag_down | 0x03): // 按键连按3次
        // Printf_Error(3);
        break;
    case (KeyFlag_event | KeyFlag_times | 0x03): // 按键连按3次后"立即"松开
        // Printf_Error(4);
        break;
    case (KeyFlag_event | KeyFlag_down | KeyFlag_Long): // 按键长按
        // Printf_Error(5);
        break;
    case (KeyFlag_event | KeyFlag_times | KeyFlag_Long): // 按键长按后松开
        // Printf_Error(6);
        break;
    case (KeyFlag_event | KeyFlag_times): // 按键松开，非连按状态下的松开
        // Printf_Error(7);
        break;
    default:
        // Printf_Error(event);
        break;
    }
}
void APP_FlashOBProgram(void)
{
    FLASH_OBProgramInitTypeDef OBInitCfg;
    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();

    OBInitCfg.OptionType = OPTIONBYTE_USER;
    // OBInitCfg.WRPSector =
    // OBInitCfg.SDKStartAddr =
    // OBInitCfg.SDKEndAddr =
    // OBInitCfg.RDPLevel =
    OBInitCfg.USERType = OB_USER_NRST_MODE; // 修改内容

    OBInitCfg.USERConfig = OB_RESET_MODE_RESET; // OB_RESET_MODE_RESET

    // OBInitCfg.USERConfig = OB_RESET_MODE_GPIO; // 修改的值，OB_RESET_MODE_GPIO

    HAL_FLASH_OBProgram(&OBInitCfg);
    HAL_FLASH_Lock();      // 锁定flash
    HAL_FLASH_OB_Lock();   // 锁定option
    HAL_FLASH_OB_Launch(); // 产生一个复位，装在OPTION byte
}
/*******************************************************************************
 * Function    : main
 * Brief       : 主函数
 * Parameter   :
 * Returns     :
 * Date        : 2020-04-03 17:14:47
 * Description :
 ******************************************************************************/
int main(void)
{
    u32 UnitDelay = 0x2000;

    while (UnitDelay--)
        ; // wait a while for hex programming if using the MCU stop mode, default NOT used.

    BSP_Init(); // 硬件初始化
    // APP_FlashOBProgram();//复位脚关闭，慎用
    Ble_Init(); // 蓝牙初始化
    Uart_Send_String((u8 *)"\r\nIND:Ble Init OK!", 18);
    UnitDelay = GetSysTickCount(); // 获取滴答时钟时间，1ms累计
    while (1)
    {
        IrqMcuGotoSleepAndWakeup(); // 蓝牙休眠判定，蓝牙工作方式为间断式工作

        if ((GetSysTickCount() - UnitDelay) >= 10)
        { // 10ms计时
            UnitDelay = GetSysTickCount();

            Key_Run();      // 按键扫描
            Fun_Uart_Run(); // 串口扫描
        }
    }
}
